package com.liu.controller;

import com.fasterxml.jackson.core.type.TypeReference;
import com.liu.annotation.HasPermission;
import com.liu.annotation.HasRole;
import com.liu.annotation.Log;
import com.liu.annotation.Repeat;
import com.liu.constant.Constants;
import com.liu.entity.LiuLoginUser;
import com.liu.entity.LiuUser;
import com.liu.liuEnum.DeleterFlagEnum;
import com.liu.service.LiuUserService;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.annotation.Async;
import org.springframework.web.bind.annotation.*;
import sun.security.action.GetLongAction;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

/**
 * 用户信息表(LiuUser)表控制层
 *
 * @author makejava
 * @since 2023-01-13 20:34:59
 */
@RestController
@RequestMapping("liuUser")
public class LiuUserController extends BaseController{
    /**
     * 服务对象
     */

    @Resource
    private LiuUserService liuUserService;

    /**
     * 分页查询
     *
     * @param liuUser 筛选条件
     * @param  liuUser 里面继承了分页条件
     * @return 查询结果
     */
//    @GetMapping
//    public ResponseEntity<Page<LiuUser>> queryByPage(LiuUser liuUser, PageRequest pageRequest) {
//        return ResponseEntity.ok(this.liuUserService.queryByPage(liuUser, pageRequest));
//    }
    //这里是老版本的写法，新版本PageRequest没有公开构造器，因此这里不能填PageRequest了，改变方法

    //因为接收json，所以这里需要添加@RequestBody，但是测试是在url里面所以不用

    @GetMapping
    @Log(title="查询用户",businessType="用户操作")
    //这个防止重复提交，这里修改，暂时不用
//    @Repeat(100)
    public ResponseEntity<Page<LiuUser>> queryByPage(  LiuUser liuUser) {
        System.out.println("进入用户操作了");
//        int i=1/0;
        return ResponseEntity.ok(this.liuUserService.queryByPage(liuUser, PageRequest.of(liuUser.getPage(),liuUser.getSize())));
    }

    @GetMapping("getInfo")
    public ResponseEntity<HashMap<String, List<String>>> getInfo() {
        return ResponseEntity.ok(this.liuUserService.getInfo());
    }

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("{id}")
//    @HasPermission("system:user:query")

    public ResponseEntity<LiuUser> queryById(@PathVariable("id") Long id) {

//        //在这里举例做限制
//        //例如格式为system:user:query admin  hr 只有查询权限结果为特定单位才能使用接口
//        //第一步，获取用户，根据用户查询他的角色或者权限，去判断接口锁需要的权限是否包含在用户所拥有的角色当中
//        LiuLoginUser loginUser = getLoginUser();
//        List<String> hasPerms = redisTemplate.getObject(Constants.PERM_PREFIX + loginUser.getToken(), new TypeReference<List<String>>() {});
//
//        if(!hasPerms.contains("system:user:query")){
//            throw new RuntimeException("这里是Controller接口里面权限的访问异常");
//        }

        return ResponseEntity.ok(this.liuUserService.queryById(id));
    }

    /**
     * 新增数据
     *
     * @param liuUser 实体
     * @return 新增结果
     */
    @PostMapping
    @HasRole("admin")
    @Log(title="创建用户",businessType = "新赠用户操作")
    public ResponseEntity<LiuUser> add(@RequestBody LiuUser liuUser, HttpServletRequest request) {
        //这里是否需要进行数据的校验，校验完成后将数据传递给service


        liuUser.setLoginIp(request.getRemoteAddr());
        liuUser.setCreateTime(new Date());
        liuUser.setCreateBy(getLoginUser().getLiuUser().getUserName());
        //这里可以控制账户状态等等
        liuUser.setStatus("0");
        liuUser.setDelFlag(DeleterFlagEnum.NO.getValue());
        return ResponseEntity.ok(this.liuUserService.insert(liuUser));
    }

    /**
     * 编辑数据
     *
     * @param liuUser 实体
     * @return 编辑结果
     */
    @PutMapping
    public ResponseEntity<LiuUser> edit(@RequestBody LiuUser liuUser) {
        return ResponseEntity.ok(this.liuUserService.update(liuUser));
    }

    /**
     * 删除数据
     *
     * @param id 主键
     * @return 删除是否成功
     */
//    @DeleteMapping
//    public ResponseEntity<Boolean> deleteById(Long id) {
//        return ResponseEntity.ok(this.liuUserService.deleteById(id));
//    }
    @DeleteMapping("{id}")
    public ResponseEntity<Boolean> deleteById(@PathVariable Long id) {
        return ResponseEntity.ok(this.liuUserService.deleteById(id));
    }

}

